package cmd

import (
	"gitee.com/liumou_site/PasswordReset/config"
	"gitee.com/liumou_site/PasswordReset/user"
	"gitee.com/liumou_site/logger"
	"fmt"
)

// AddUser 添加或更新用户配置
func AddUser(username, passwordSuffix string, createIfNotExist bool, autoCreateUser bool, passwordPrefix bool) error {
	logger.Info("开始处理用户: %s", username)
	
	// 检查系统用户是否存在
	exists, err := checkSystemUserExists(username)
	if err != nil {
		return fmt.Errorf("检查系统用户失败: %v", err)
	}
	
	if !exists {
		if !createIfNotExist {
			return fmt.Errorf("系统用户 '%s' 不存在，使用 -add 参数创建", username)
		}
		logger.Info("系统用户 '%s' 不存在，将创建新用户", username)
	} else {
		logger.Info("系统用户 '%s' 已存在", username)
	}
	
	// 初始化安全密钥管理器
	keyManager := config.NewSecureKeyManager()
	if err := keyManager.Initialize(); err != nil {
		return fmt.Errorf("初始化密钥管理器失败: %v", err)
	}

	// 获取主密钥
	key, err := keyManager.GetMasterKey()
	if err != nil {
		return fmt.Errorf("获取加密密钥失败: %v", err)
	}
	
	// 检查是否已存在配置
	existingUsers, err := config.LoadAllUserConfigs(key)
	if err != nil {
		return fmt.Errorf("加载现有配置失败: %v", err)
	}
	
	userConfig := &config.UserConfig{
		Username:       username,
		Password:       passwordSuffix,
		AutoCreateUser: autoCreateUser,
		PasswordPrefix: passwordPrefix,
	}
	
	// 检查是否已存在该用户配置
	var userExists bool
	for _, existing := range existingUsers {
		if existing.Username == username {
			userExists = true
			break
		}
	}
	
	if userExists {
		// 更新现有用户配置
		if err := config.SaveUserConfig(userConfig, key); err != nil {
			return fmt.Errorf("更新用户配置失败: %v", err)
		}
		logger.Info("用户配置已更新: %s", username)
	} else {
		// 添加新用户配置
		if err := config.SaveUserConfig(userConfig, key); err != nil {
			return fmt.Errorf("保存用户配置失败: %v", err)
		}
		logger.Info("用户配置已添加: %s", username)
	}
	
	return nil
}

// checkSystemUserExists 检查系统用户是否存在
func checkSystemUserExists(username string) (bool, error) {
	return user.UserExists(username)
}

// ListUsers 列出所有用户
func ListUsers() error {
	logger.Info("开始列出所有用户")
	
	// 初始化安全密钥管理器
	keyManager := config.NewSecureKeyManager()
	if err := keyManager.Initialize(); err != nil {
		return fmt.Errorf("初始化密钥管理器失败: %v", err)
	}

	// 获取主密钥
	key, err := keyManager.GetMasterKey()
	if err != nil {
		return fmt.Errorf("获取加密密钥失败: %v", err)
	}
	
	// 加载所有用户配置
	users, err := config.LoadAllUserConfigs(key)
	if err != nil {
		return fmt.Errorf("加载用户配置失败: %v", err)
	}
	
	if len(users) == 0 {
		logger.Info("当前没有用户")
		return nil
	}
	
	logger.Info("当前用户列表:")
	for i, user := range users {
		prefixMode := "后缀"
		if user.PasswordPrefix {
			prefixMode = "前缀"
		}
		autoCreate := "否"
		if user.AutoCreateUser {
			autoCreate = "是"
		}
		logger.Info("  %d. 用户名: %s, 自动创建: %s, 密码模式: %s", i+1, user.Username, autoCreate, prefixMode)
	}
	
	return nil
}

// RemoveUser 删除用户
func RemoveUser(username string) error {
	logger.Info("开始删除用户: %s", username)
	
	// 初始化安全密钥管理器
	keyManager := config.NewSecureKeyManager()
	if err := keyManager.Initialize(); err != nil {
		return fmt.Errorf("初始化密钥管理器失败: %v", err)
	}

	// 获取主密钥
	key, err := keyManager.GetMasterKey()
	if err != nil {
		return fmt.Errorf("获取加密密钥失败: %v", err)
	}
	
	// 删除用户配置
	if err := config.DeleteUserConfig(username, key); err != nil {
		return fmt.Errorf("删除用户配置失败: %v", err)
	}
	
	logger.Info("用户删除成功: %s", username)
	return nil
}

// ListSystemUsers 列出当前系统支持登录的用户
func ListSystemUsers() error {
	logger.Info("开始获取系统用户列表")
	
	users, err := user.ListSystemUsers()
	if err != nil {
		logger.Error("获取系统用户列表失败:", err)
		return fmt.Errorf("获取系统用户列表失败: %v", err)
	}
	
	if len(users) == 0 {
		logger.Info("当前系统没有可添加的登录用户")
		return nil
	}
	
	// 使用格式化输出
	result, err := user.GetUserListString()
	if err != nil {
		logger.Error("格式化用户列表失败:", err)
		return fmt.Errorf("格式化用户列表失败: %v", err)
	}
	
	logger.Info("系统用户列表:")
	logger.Info("\n%s", result)
	logger.Info("共找到 %d 个可添加的用户", len(users))
	return nil
}
